/**
 * 接口依赖
 */

const fs = require('fs');
// fs 异步 / 同步方法  () => {}
// callback hell 回调地狱： 代码可读性差； 可维护性差；可复用性差
// 1. 解决异步的第一种方案：回调函数
fs.readFile('./data/data1.json', (err, data) => {
  const file2 = JSON.parse(data.toString())
  fs.readFile(file2.name, (err, data) => {
    const file3 = JSON.parse(data.toString())
    fs.readFile(file3.name, (err, data) => {
      const file4 = JSON.parse(data.toString())
    })
  })
})

// 2. 解决异步的第二种方案。promise  --> 状态不可逆
// pedding -----> resolve  停不下来
// pedding -----> reject
function myReadFile(fileUrl) {
  return new Promise((resolve, reject) => {
    fs.readFile(fileUrl, (err, data) => {
      if (err) {
        reject(err)
      } else {
        resolve(JSON.parse(data.toString()))
      }
    })
  })
}

myReadFile('./data/data1.json')
  .then(response => {
    return myReadFile(response.name)
  })
  .then(response => {
    return myReadFile(response.name)
  })
  .then(response => {
    // console.log('response....2:', response)
    // return myReadFile(response.name)
  })

// 3. 异步解决方案：function*() {}  fucntion generator() {}



// 4. 终极异步解决方案 ： async await

/**
 *
 * async函数可以将异步代码以同步方式输出；
 *
 * 1. 一旦函数前面加上async 这个字段 就变成了promise函数 （返回一个promise,需要.then调用）
 *
 * 2. awiat 后面一般跟一个promise
 * 3. awiat 必须配合async使用, async 可以不使用await
 * 4.  return 一般放在最后一个，返回await等待的结果
 */

async function myAsyncFn() {
  let data = await myReadFile('./data/data1.json')
  // console.log()
  let data1 = await myReadFile(data.name)
  let data2 = await myReadFile(data1.name)
  return data.name + data1.name + data2.name;
}

myAsyncFn().then(res => {
  console.log('res:....', res)
})

// function myPromise() {
//   return new Promise((resolve, reject) => {
//     setTimeout(() => {
//       resolve('hello world')
//     }, 2000)
//   })
// }

// async function AsyncFn() {
//   let data = await myPromise()
//   // 同步接收，如果这个函数是一个异步函数，你就接收不到结果
//   // await 可以帮助你等待异步结果执行完毕之后，同步赋值
//   console.log('data....', data)
//   return data;
// }
// AsyncFn().then(res => {
//   // console.log('res:...',res)
// })

